剑指Offer 35 第一个只出现一次的字符

题目描述

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置。如果字符串为空,返回-1

思路

  1. 暴力法很好解得;
  2. 你很容想到,遍历一遍记下出现的次数,由于字符不变,很容易也就想到了HashMap喽

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    static public int FirstNotRepeatingChar(String str) {
    if (str==null||str.length()==0)
    return -1;
    char a[] = str.toCharArray(); //这个数组是多余的内存消耗,应该写成str.charAt(index)获取当前字符
    HashMap<Character,Integer> hashMap = new HashMap();
    for (int i = 0; i < a.length; i++) {
    if (hashMap.containsKey(a[i])) //如果出现过
    hashMap.put(a[i],hashMap.get(a[i])+1); //将value+1;
    else
    hashMap.put(a[i],0);
    }
    for (int i = 0; i < a.length; i++) { //hashmap是无序的,所以要按照原字符串的顺序寻找
    if (hashMap.get(a[i])==0)
    return i+1;
    }
    return 0;
    }

收获

  1. HashMap的使用,hash表真的是不可以放重复元素,就是说你加入即便,他都只有这么一个键值对,但是键值中的值是可以改变的,就像上面代码中的一样